# 多阶段构建 + alpine 基础镜像。

# 第一次构建 (构建阶段)
FROM node:18.0-alpine3.14 as build-stage
WORKDIR /app
# 如果package文件没有变动,也会跳过npm install,会直接走缓存,然后从有变化的指令继续构建下去
COPY package.json .
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install
COPY . .
RUN npm run build


# 第二次构建 (生产阶段)
FROM node:18.0-alpine3.14 as production-stage
WORKDIR /app
COPY --from=build-stage /app/dist /app
COPY --from=build-stage /app/package.json /app/package.json
#COPY --from=build-stage /app/node_modules /app/node_modules
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install --production
EXPOSE 3000
CMD ["node", "/app/main.js"]



# docker build 之后，只会留下最后一个阶段的镜像。

# FROM node:18：基于 Node.js 18 版本的镜像作为基础镜像(Linux是基础版本体积过大,建议使用node:18-alpine)。
# WORKDIR /app：设置工作目录为 /app。
# COPY package.json .：将当前目录下的 package.json 文件复制到容器内的工作目录。
# RUN npm config set registry https://registry.npmmirror.com/：安装pnpm, 设置 pnpm 镜像源为 https://registry.npmmirror.com/。
# RUN pnpm install：安装 package.json 中定义的依赖包。
# COPY . .：将当前目录下的所有文件复制到容器内的工作目录。
# RUN pnpm build：运行 pnpm build 命令，对应的是 package.json 中的 scripts.build 命令。
# EXPOSE 3000：声明容器内的应用程序将监听 3000 端口。
# CMD [ "node", "./dist/main.js" ]：设置容器启动时的默认命令，即启动 Node.js 应用程序的入口文件 main.js。